/**************************************
 *
 * Programme : joueurHexx.h
 *
 * Synopsis : entete du protocole d'acces a l'arbitre
 *            pour Hexxagon
 *
 * Ecrit par : JL,LP,VF 15 / 02 / 13
 * 
/***************************************/

#ifndef _protocolArbitre_h
#define _protocolArbitre_h

/* Taille des chaines */
#define TAIL_CHAIN 30


/* Identificateurs des requetes */
typedef enum { IDENTIFICATION, PARTIE, COUP } TypIdRequest;

/* Types d'erreur */
typedef enum { ERR_OK,    /* Validation de la requete */
	       ERR_NOM,        /* Nom inconnu */
	       ERR_JOUEUR,     /* Identificateur de joueur inconnu */
	       ERR_COUP,       /* Erreur sur le coup joue */
	       ERR_TYP         /* Erreur sur le type de requete */
} TypErreur;

/* 
 * Structures d'identification 
 */
typedef struct {

  TypIdRequest idRequest;         /* Identificateur de la requete */
  char nom[TAIL_CHAIN];           /* Nom du joueur */

} TypIdentificationReq;

typedef struct{

  TypErreur err;                  /* Code d'erreur */
  int       joueur;               /* Identificateur du joueur */

} TypIdentificationRep;

/* 
 * Structures demande de partie
 */
typedef enum { FAUX, VRAI } TypBooleen;

typedef struct{

  TypIdRequest idRequest;         /* Identificateur de la requete */
  int          joueur;            /* Identificateur du joueur */

} TypPartieReq;

typedef struct {

  TypErreur  err;                 /* Code d'erreur */
  int        adversaire;          /* Identificateur de l'adversaire */
  TypBooleen finTournoi;          /* Indicateur de fin */
  TypBooleen premier;             /* Pour savoir qui debute la partie  */

} TypPartieRep;

/*
 * Definition des types pour les deux axes
 */
typedef enum { AXE_UN, AXE_DEUX, AXE_TROIS, AXE_QUATRE, AXE_CINQ, AXE_SIX, AXE_SEPT, AXE_HUIT, AXE_NEUF } TypAxeC;
typedef enum { AXE_A, AXE_B, AXE_C, AXE_D, AXE_E, AXE_F, AXE_G, AXE_H, AXE_I } TypAxeL;

/* 
 * Definition d'une case
 */
typedef struct {

  TypAxeL axeLettre;
  TypAxeC axeChiffre;

} TypPosition ;

/* 
 * Structures coup du joueur pour l'arbitre
 */

/* Propriete des coups */
typedef enum { DEPL, SAUT, GAGNE, PERD, NULLE } TypPropCoup;

typedef enum { ROUGE, BLEU } TypPiece;

typedef struct {

  TypIdRequest idRequest;     /* Identificateur de la requete */
  TypPiece couleurPiece;      /* Couleur de la pièce */
  TypPropCoup  propCoup;      /* Propriete du coup */
  TypBooleen bloq;            /* Joueur bloque ou non */  
  TypPosition  caseDepPiece;  /* Position de départ de la piece */
  TypPosition  caseArrPiece;  /* Position d'arrivée de la pièce */
  int          numeroDuCoup;  /* Numero du coup */

} TypCoupReq;

/* Validite du coup */
typedef enum { VALID, TIMEOUT, TRICHE } TypValCoup;

/* Reponse a un coup */
typedef struct {

  TypErreur err;                  /* Code d'erreur */
  TypValCoup validCoup;           /* Validite du coup */

} TypCoupRep;
#endif